/*
 *  Estado          Metodo
 *  Sin P                listarCategorias
 *  Sin P                listarCategoriasSinArticulos
 *  Falta la relacion???                insertarCategoria
 *  Sin P                eliminarCategoria
 *  Sin P                modificarCategria
 */

package gestores.administracion;

import dal.CampaniaDAL;

import dal.CategoriaDAL;

import excepciones.AvwException;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.logging.Level;

import java.util.logging.Logger;

import negocio.CampaniaWeb;

import negocio.CategoriaWeb;

import util.Utiles;

public class GestorCategoria {
    
    static final Logger logger = Utiles.iniciarLogger("GestorCategoria", false);
    
    public GestorCategoria() {
    }
    
    
    /**
     * Lista todas las categorias.
     * @return ArrayList<HashMap> con los siguientes datos de las categorias de articulos:
     * "cawCodigo" codigo,
     * "cawNombre" nombre y
     * "cawNombrePadre" codigo categoria padre.
     */
    public static ArrayList<HashMap> listarCategorias() throws AvwException, NullPointerException {
        ArrayList<HashMap> arrayList = new ArrayList<HashMap>();
        
        try {
            logger.info("Llamo a listar categorias");
            ArrayList<CategoriaWeb> categorias =
                    CategoriaDAL.listarCategorias();
            for (CategoriaWeb cw: categorias) {
                HashMap hashMap = new HashMap();
                hashMap.put("cawCodigo", cw.getCawCodigo());
                hashMap.put("cawNombre", cw.getCawNombre());
                hashMap.put("cawNombrePadre", cw.getCawCategoriaPadre().getCawNombre());
                arrayList.add(hashMap);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        if(arrayList == null){throw new AvwException("Error.");}
        return arrayList;
        
    }
        /**
     * Lista todas las categorias.
     * @return ArrayList<HashMap> con los siguientes datos de las categorias de articulos:
     * "cawCodigo" codigo,
     * "cawNombre" nombre y
     * "cawNombrePadre" codigo categoria padre.
     */
    public static ArrayList<HashMap> listarCategoriasFiltro(int opcionFiltro, String filtro) throws AvwException, NullPointerException {
        ArrayList<HashMap> arrayList = new ArrayList<HashMap>();
        
        try {
            logger.info("Llamo a listar categorias");
            ArrayList<CategoriaWeb> categorias =
                    CategoriaDAL.listarCategoriasFiltro(opcionFiltro, filtro);
            for (CategoriaWeb cw: categorias) {
                HashMap hashMap = new HashMap();
                hashMap.put("cawCodigo", cw.getCawCodigo());
                hashMap.put("cawNombre", cw.getCawNombre());
                hashMap.put("cawNombrePadre", cw.getCawCategoriaPadre().getCawNombre());
                arrayList.add(hashMap);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        if(arrayList == null){throw new AvwException("Error.");}
        return arrayList;
        
    }
    /**
     * Lista las categorias que no tengan articulos.
     * @return ArrayList<HashMap> con los siguientes datos de las categorias que no tienen articulos relacionados:
     * "cawCodigo" codigo,
     * "cawNombre" nombre y
     */
    public static ArrayList<HashMap> listarCategoriasSinArticulos() throws AvwException, NullPointerException{
        ArrayList<HashMap> arrayList = new ArrayList<HashMap>();
        
        logger.info("Llamo a listar categorias Sin ARticulos");
        ArrayList<CategoriaWeb> categorias =
                CategoriaDAL.listarCategoriasSinArticulo();
        for (CategoriaWeb cw: categorias) {
            HashMap hashMap = new HashMap();
            hashMap.put("cawCodigo", cw.getCawCodigo());
            hashMap.put("cawNombre", cw.getCawNombre());
            arrayList.add(hashMap);
        }
        
        return arrayList;
    }
    
    /**
     * Lista las categorias que no tengan articulos.
     * @return ArrayList<HashMap> con los siguientes datos de las categorias que no tienen articulos relacionados:
     * "cawCodigo" codigo,
     * "cawNombre" nombre y
     */
    public static ArrayList<HashMap> listarCategoriasSinPadre() throws AvwException, NullPointerException{
        ArrayList<HashMap> arrayList = new ArrayList<HashMap>();
        
        logger.info("Llamo a listar categorias Sin ARticulos");
        ArrayList<CategoriaWeb> categorias =
                CategoriaDAL.listarCategoriasSinPadre();
        for (CategoriaWeb cw: categorias) {
            HashMap hashMap = new HashMap();
            hashMap.put("cawCodigo", cw.getCawCodigo());
            hashMap.put("cawNombre", cw.getCawNombre());
            arrayList.add(hashMap);
        }
        
        return arrayList;
    }
    
    /**
     * @param nombre    String
     * @param palabrasClaves    String
     * @param cawCodigoPadre    String
     * @param categoriasRelacion ArrayList<HashMap> de codigos 'cawCodigo'
     */
    public static void insertarCategoria(String nombre, String palabrasClaves,
            String cawCodigoPadre,
            ArrayList<HashMap> categoriasRelacion) throws AvwException{
        CategoriaWeb cw = new CategoriaWeb();
        cw.setCawNombre(nombre);
        cw.setCawPalabrasClaves(palabrasClaves);
        //Seteo la categoria padre
        cw.setCawCategoriaPadre(new CategoriaWeb(cawCodigoPadre));
        //Seteo de las relaciones
        ArrayList<CategoriaWeb> categorias = new ArrayList<CategoriaWeb>();
        for(HashMap categoria: categoriasRelacion){
            CategoriaWeb cat = new CategoriaWeb();
            cat.setCawCodigo(categoria.get("cawCodigo").toString());
            categorias.add(cat);
        }
        cw.setCawCategoriaRelacion(categorias);
        
        logger.info("Inserto categoria");
        CategoriaDAL.insertarCategoria(cw);
        
    }
    
    /**
     * Elimina la categoria cuyo codigo es igual a cawCodigo
     * @param cawCodigo Codigo de la categoria que se desea eliminar
     * @return boolean, true si se pudo eliminar, false si la categoria tiene
     * articulos relacionados y no se pudo eliminar.
     */
    public static boolean eliminarCategoria(String cawCodigo) throws AvwException {
        CategoriaWeb categoriaWeb = new CategoriaWeb(cawCodigo);
        
        if (!categoriaWeb.tieneArticulos()){
            CategoriaDAL.eliminarCategoria(categoriaWeb);
            return true;
        }
        
        return false;
    }
    
    /**
     * Modifica la categoriaWeb cuyo codigo sea igual a cawCodigo con los datos
     * que se envian por parametro
     * @param cawCodigo
     * @param nombre
     * @param palabrasClaves
     * @param cawCodigoPadre
     * @param cawCodigoRelacionadas
     */
    public static void modificarCategria(String cawCodigo, String nombre,
            String palabrasClaves,
            String cawCodigoPadre,
            ArrayList cawCodigoRelacionadas) throws AvwException{
        
        CategoriaWeb categoriaWeb = new CategoriaWeb(cawCodigo);
        categoriaWeb.setCawNombre(nombre);
        categoriaWeb.setCawPalabrasClaves(palabrasClaves);
        categoriaWeb.setCawCategoriaPadre(new CategoriaWeb(cawCodigoPadre));
        categoriaWeb.setCawCategoriaRelacion(cawCodigoRelacionadas);
        
        CategoriaDAL.modificarCategoria(categoriaWeb);        
    }
    
    public static HashMap obtenerDatosCategoria(String cawCodigo) throws AvwException, NullPointerException{
        CategoriaWeb categoriaWeb = new CategoriaWeb(cawCodigo);
        if (cawCodigo.equals("-1")){
            categoriaWeb.setCawNombre("Pagina Principal");
        }else{
            categoriaWeb = CategoriaDAL.obtenerCategoria(categoriaWeb);
        }
        HashMap categoriaHash = new HashMap();
        
        categoriaHash.put("cawCodigo", categoriaWeb.getCawCodigo());
        categoriaHash.put("cawNombre",categoriaWeb.getCawNombre());
        categoriaHash.put("cawCodigoPadre",categoriaWeb.getCawCategoriaPadre().getCawCodigo());
        categoriaHash.put("cawNombrePadre",categoriaWeb.getCawCategoriaPadre().getCawNombre());
        ArrayList categoriaRelacionada = new ArrayList();
        for (CategoriaWeb catRelacion : categoriaWeb.getCawCategoriaRelacion()){
            HashMap relacionHash = new HashMap();
            relacionHash.put("cawNombreRelacionada", catRelacion.getCawNombre());
            relacionHash.put("cawCodigoRelacionada",catRelacion.getCawCodigo());
            categoriaRelacionada.add(relacionHash);
        }
        categoriaHash.put("nombreRelacionados", categoriaRelacionada);
        categoriaHash.put("cawPalabrasClaves", categoriaWeb.getCawPalabrasClaves());
        return categoriaHash;
    }
    
    
}
